package com.happy.unitconvert.service;

import reactor.core.publisher.Mono;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 汇率服务接口
 * 提供汇率查询和转换功能
 *
 * @author Happy
 */
public interface ExchangeRateService {

  /**
   * 获取指定基础货币的所有汇率
   *
   * @param baseCurrency 基础货币代码（如USD, EUR等）
   * @return 包含所有汇率的Map，Key为目标货币代码，Value为汇率值
   */
  Mono<Map<String, BigDecimal>> getExchangeRates(String baseCurrency);

  /**
   * 获取特定货币对的汇率
   *
   * @param fromCurrency 源货币代码
   * @param toCurrency   目标货币代码
   * @return 汇率值
   */
  Mono<BigDecimal> getExchangeRate(String fromCurrency, String toCurrency);

  /**
   * 执行货币转换
   *
   * @param amount       转换金额
   * @param fromCurrency 源货币代码
   * @param toCurrency   目标货币代码
   * @return 转换后的金额
   */
  Mono<BigDecimal> convertCurrency(BigDecimal amount, String fromCurrency, String toCurrency);

  /**
   * 批量货币转换
   *
   * @param amount       转换金额
   * @param fromCurrency 源货币代码
   * @param toCurrencies 目标货币代码列表
   * @return 转换结果Map，Key为目标货币代码，Value为转换后的金额
   */
  Mono<Map<String, BigDecimal>> convertCurrencyBatch(BigDecimal amount, String fromCurrency, List<String> toCurrencies);

  /**
   * 获取支持的货币代码列表
   *
   * @return 支持的货币代码列表
   */
  Mono<List<String>> getSupportedCurrencies();

  /**
   * 刷新汇率缓存
   *
   * @param baseCurrency 要刷新的基础货币，如果为null则刷新所有
   * @return 刷新完成信号
   */
  Mono<Void> refreshCache(String baseCurrency);

  /**
   * 检查汇率数据是否可用
   *
   * @return true 如果服务可用，false 如果不可用
   */
  Mono<Boolean> isServiceAvailable();
}
